import os.path

from django.test import TestCase

# Do NOT use relative imports here
from pretix.plugins.banktransfer import csvimport

# These tests need data files. Don't worry, they are fully anonymized,
# all IBANs are random/fake.
DATA_DIR = os.path.dirname(__file__)


class CsvImportTest(TestCase):
    def _test_from_sample_file(self, filename, expected, hint, expected_parsed):
        with open(os.path.join(DATA_DIR, filename), 'rb') as f:
            data = csvimport.get_rows_from_file(f)
            self.assertEqual(data, expected)
            parsed, good = csvimport.parse(data, hint)
            self.assertEqual(parsed, expected_parsed)

    def test_sample_file_bbbank(self):
        expected = [
            [
                'Buchungstag',
                'Valuta',
                'Auftraggeber/Zahlungsempfänger',
                'Empfänger/Zahlungspflichtiger',
                'Konto-Nr.',
                'BLZ',
                'Vorgang/Verwendungszweck',
                'Währung',
                'Umsatz',
                ' ',
            ],
            [
                '10.04.2015',
                '10.04.2015',
                'Mustermann, Max',
                'Einzug ',
                '',
                '',
                'LASTSCHRIFT\nEinzug Nutzungsgebuehren IB\nAN: DE76574670095813552253',
                'EUR',
                '42,23',
                'S',
            ],
            [
                '08.04.2015',
                '08.04.2015',
                'Mustermann, Max',
                'Kunde, Karl',
                '',
                '',
                'GUTSCHRIFT\nTicket 2015XAZTY IBAN: DE83\n839857672994615084',
                'EUR',
                '42,23',
                'H',
            ],
            [],
            ['07.04.2015', '', '', '', '', '', 'EUR', 'Anfangssaldo', '1.337,00', 'H'],
            ['10.04.2015', '', '', '', '', '', 'EUR', 'Endsaldo', '1.337,00', 'H'],
        ]
        hint = {
            'payer': [3],
            'reference': [6],
            'date': 1,
            'amount': 8,
            'cols': 10,
        }
        expected_parsed = [
            {
                'date': '10.04.2015',
                'reference': 'LASTSCHRIFT\nEinzug Nutzungsgebuehren IB\nAN: DE76574670095813552253',
                'payer': 'Einzug',
                'amount': '42,23',
            },
            {
                'date': '08.04.2015',
                'reference': 'GUTSCHRIFT\nTicket 2015XAZTY IBAN: DE83\n839857672994615084',
                'payer': 'Kunde, Karl',
                'amount': '42,23',
            },
        ]
        filename = 'csvimport_data_de_bbbank.csv'
        self._test_from_sample_file(filename, expected, hint, expected_parsed)

    def test_sample_file_sparkasse(self):
        expected = [
            [
                'Auftragskonto',
                'Buchungstag',
                'Valutadatum',
                'Buchungstext',
                'Verwendungszweck',
                'Begünstigter/Zahlungspflichtiger',
                'Kontonummer',
                'BLZ',
                'Betrag',
                'Währung',
                'Info',
            ],
            [
                '123456',
                '09.03',
                '09.03.15',
                'ONLINE-UEBERWEISUNG',
                'SVWZ+Begleichung Rechnung 1234',
                'Max Mustermann',
                'DE13495179316396679327',
                'THISISNOBIC',
                '-23,42',
                'EUR',
                'Umsatz gebucht',
            ],
            [
                '123456',
                '03.03',
                '03.03.15',
                'GUTSCHRIFT',
                'EREF+123456789 Ticket-Bestellung 2015XALSK',
                'Karl Kunde',
                'DE89701226010601035858',
                'THISISNOBIC',
                '42,32',
                'EUR',
                'Umsatz gebucht',
            ],
        ]
        hint = {
            'payer': [5, 6, 7],
            'reference': [4],
            'date': 2,
            'amount': 8,
            'cols': 11,
        }
        expected_parsed = [
            {
                'date': '09.03.15',
                'reference': 'SVWZ+Begleichung Rechnung 1234',
                'payer': 'Max Mustermann\nDE13495179316396679327\nTHISISNOBIC',
                'amount': '-23,42',
            },
            {
                'date': '03.03.15',
                'reference': 'EREF+123456789 Ticket-Bestellung 2015XALSK',
                'payer': 'Karl Kunde\nDE89701226010601035858\nTHISISNOBIC',
                'amount': '42,32',
            },
        ]
        filename = 'csvimport_data_de_sparkassernn.csv'
        self._test_from_sample_file(filename, expected, hint, expected_parsed)

    def test_sample_file_gls(self):
        expected = [
            [
                'Kontonummer',
                'Buchungstag',
                'Wertstellung',
                'Auftraggeber/Empfänger',
                'Buchungstext',
                'VWZ1',
                'VWZ2',
                'VWZ3',
                'VWZ4',
                'VWZ5',
                'VWZ6',
                'VWZ7',
                'VWZ8',
                'VWZ9',
                'VWZ10',
                'VWZ11',
                'VWZ12',
                'VWZ13',
                'VWZ14',
                'Betrag',
                'Kontostand',
                'Währung',
            ],
            [
                '123456789',
                '09.04.2015',
                '09.04.2015',
                'Lars Lieferant',
                'OnlBanking-Euro-Überweisung',
                'BIC:THISINOBIC',
                'IBAN:DE59433524647958971194',
                'Datum: 09.04.15 Zeit: 10:47',
                'KD 1234567 TAN 123456',
                'Rechnung Nr. 123',
                '456',
                '',
                '',
                '',
                '',
                '',
                '',
                '',
                '',
                '-42,00',
                '1.337,00',
                'EUR',
            ],
            [
                '123456789',
                '08.04.2015',
                '08.04.2015',
                'Karl Kunde',
                'SEPA-Überweisung',
                'Ticket-Bestellung',
                'Bestellnummer 2015ABC',
                'DEV',
                '',
                '',
                '',
                '',
                '',
                '',
                '',
                '',
                '',
                '',
                '',
                '12,00',
                '1.325,00',
                'EUR',
            ],
        ]
        hint = {
            'payer': [3],
            'reference': [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
            'date': 2,
            'amount': 19,
            'cols': 22,
        }
        expected_parsed = [
            {
                'date': '09.04.2015',
                'reference': 'BIC:THISINOBIC\nIBAN:DE59433524647958971194\nDatum: 09.04.15 Zeit: 10:47\nKD 1234567 TAN '
                '123456\nRechnung Nr. 123\n456',
                'amount': '-42,00',
                'payer': 'Lars Lieferant',
            },
            {
                'date': '08.04.2015',
                'reference': 'Ticket-Bestellung\nBestellnummer 2015ABC\nDEV',
                'amount': '12,00',
                'payer': 'Karl Kunde',
            },
        ]
        filename = 'csvimport_data_de_gls.csv'
        self._test_from_sample_file(filename, expected, hint, expected_parsed)

    def test_sample_file_dab(self):
        expected = [
            [
                'Buchungstag',
                'Valuta',
                'Buchungstext',
                'Auftraggeber / Empfänger',
                'Verwendungszweck',
                'Betrag in EUR',
                '',
            ],
            [
                '09.04.2015',
                '09.04.2015',
                'SEPA-Überweisung',
                'Karl Kunde',
                'Bestellung 2015ABCDE',
                '23,00',
                '',
            ],
            [
                '09.04.2015',
                '09.04.2015',
                'SEPA-Überweisung',
                'Karla Kundin',
                'Bestellung 2015FGHIJ',
                '42,00',
                '',
            ],
        ]
        hint = {
            'payer': [3],
            'reference': [4],
            'date': 1,
            'amount': 5,
            'cols': 7,
        }
        expected_parsed = [
            {
                'payer': 'Karl Kunde',
                'reference': 'Bestellung 2015ABCDE',
                'amount': '23,00',
                'date': '09.04.2015',
            },
            {
                'payer': 'Karla Kundin',
                'reference': 'Bestellung 2015FGHIJ',
                'amount': '42,00',
                'date': '09.04.2015',
            },
        ]
        filename = 'csvimport_data_de_dab.csv'
        self._test_from_sample_file(filename, expected, hint, expected_parsed)

    def test_sample_file_postbank(self):
        expected = [
            [
                'Buchungstag',
                'Wertstellung',
                'Umsatzart',
                'Buchungsdetails',
                'Auftraggeber',
                'Empfänger',
                'Betrag (€)',
                'Saldo (€)',
            ],
            [
                '07.08.2016',
                '01.08.2016',
                'Gutschrift',
                'Verwendungszweck 2015ABCDE',
                'Karla Kundin',
                'Fiktive Veranstaltungsgesellschaft mbH',
                '\xa4 42,00',
                '\xa4 1.337,42',
            ],
            [
                '29.07.2016',
                '29.07.2016',
                'Gutschrift',
                'Referenz NOTPROVIDED',
                'Lars Lieferant',
                'Fiktive Veranstaltungsgesellschaft mbH',
                '\xa4 56,76',
                '\xa4 1.337,42',
            ],
        ]
        hint = {
            'payer': [4],
            'reference': [3],
            'date': 0,
            'amount': 6,
            'cols': 8,
        }
        expected_parsed = [
            {
                'payer': 'Karla Kundin',
                'reference': 'Verwendungszweck 2015ABCDE',
                'amount': '42,00',
                'date': '07.08.2016',
            },
            {
                'payer': 'Lars Lieferant',
                'reference': 'Referenz NOTPROVIDED',
                'amount': '56,76',
                'date': '29.07.2016',
            },
        ]
        filename = 'csvimport_data_de_postbank.csv'
        self._test_from_sample_file(filename, expected, hint, expected_parsed)
